package com.wanxin.wb.common.support.exception;

import com.wanxin.wb.common.support.util.StringUtils;

/**
 * feiniu.com Inc.
 * Copyright (c) 2013-2014 All Rights Reserved.
 */





/**
 * <B>Description:</B> 业务异常处理类<br>
 * <B>Create on:</B> 2014年12月15日 上午8:47:08<br>
 *
 * @author yuan.qin
 * @author 
 * @version 1.0
 */
public class BusinessExceptionHandle {
    static ThreadLocal<IExceptionHandler> exceptionHandlerLocal = new ThreadLocal<IExceptionHandler>() {
                                                                };
    public static final CodeDesc SYS_UNKNOWN_ERROR                     = CodeDesc.newCodeDesc("A0000", "未知错误");

    /**
     * <B>Description:</B> 设置异常处理器<br>
     * <B>Create on:</B> 2015年3月19日 下午6:33:56<br>
     *
     * @param exceptionHandler
     * @author 
     */
    public static void setExceptionHandler(IExceptionHandler exceptionHandler) {
        exceptionHandlerLocal.set(exceptionHandler);
    }

    /**
     * <B>Description:</B> 获取异常处理器 <br>
     * <B>Create on:</B> 2015年3月19日 下午6:34:44<br>
     *
     * @return
     * @author 
     */
    static IExceptionHandler getExceptionHandler() {
        return exceptionHandlerLocal.get();
    }

    public static void handleError(Exception ex, CodeDesc codeDesc) {
        if (ex instanceof BusinessException) {
            throw ((BusinessException) ex);
        }
        handleError(codeDesc);
    }

    public static void handleError(Exception ex, CodeDesc codeDesc, String msg) {
        if (ex instanceof BusinessException) {
            throw ((BusinessException) ex);
        }
        handleError(codeDesc, msg);
    }

    /**
     * <B>Description:</B> 抛出指定业务编码的错误<br>
     * <B>Create on:</B> 2015年3月17日 下午3:52:45<br>
     *
     * @param codeDesc
     * @author 
     */
    public static void handleError(CodeDesc codeDesc) {
        if (codeDesc == null)
            codeDesc = SYS_UNKNOWN_ERROR;
        handleError(codeDesc.getCode(), codeDesc.getMsg());
    }

    /**
     * <B>Description:</B> <br>
     * <B>Create on:</B> 2015年3月17日 下午3:53:59<br>
     *
     * @param codeDesc
     * @param msg
     * @author 
     */
    public static void handleError(CodeDesc codeDesc, String msg) {
        if (codeDesc == null)
            codeDesc = SYS_UNKNOWN_ERROR;
        String s = StringUtils.joinErrorMessages(codeDesc.getMsg(), msg);
        handleError(codeDesc.getCode(), s);
    }

    /**
     * <B>Description:</B> 抛出自定义错误<br>
     * <B>Create on:</B> 2015年3月17日 下午1:48:34<br>
     *
     * @param code
     * @param msg
     * @param t
     * @author 
     */
    public static void handleError(String code, String msg, Throwable t) {
        if (t instanceof BusinessException) {
            throw (BusinessException) t;
        }
        throw new BusinessException(code, msg, t);
    }

    /**
     * <B>Description:</B>  抛出自定义错误,指定错误信息<br>
     * <B>Create on:</B> 2015年3月17日 下午1:48:58<br>
     *
     * @param msg
     * @param t
     * @author 
     */
    public static void handleErrorWithMessage(String msg, Throwable t) {
        if (t instanceof BusinessException) {
            throw (BusinessException) t;
        }
        throw new BusinessException(msg, t);
    }

    /**
     * <B>Description:</B> 抛出自定义错误,指定编码<br>
     * <B>Create on:</B> 2015年3月17日 下午1:49:26<br>
     *
     * @param code
     * @param t
     * @author 
     */
    public static void handleErrorWithCode(String code, Throwable t) {
        if (t instanceof BusinessException) {
            throw (BusinessException) t;
        }
        throw new BusinessException(code, null, t);
    }

    /**
     * <B>Description:</B> 抛出自定义错误,指定编码和错误信息<br>
     * <B>Create on:</B> 2015年3月17日 下午1:52:41<br>
     *
     * @param code
     * @param msg
     * @author 
     */
    public static void handleError(String code, String msg) {
        throw new BusinessException(code, msg);
    }

}
